/**
 * 安全更新混入
 * 为所有组件提供安全的数据更新方法
 */

import { simpleUpdate } from '@/utils/simpleUpdate.js'
import errorMonitoring from '@/utils/errorMonitoring.js'

export default {
  data() {
    return {
      _isComponentActive: true,
      _updateRetryCount: 0,
      _maxRetries: 3
    }
  },

  beforeCreate() {
    // 组件创建前标记为活跃
    this._isComponentActive = true
  },

  mounted() {
    // 组件挂载后确保活跃状态
    this._isComponentActive = true
  },

  beforeDestroy() {
    // 组件销毁前标记为不活跃
    this._isComponentActive = false
  },

  destroyed() {
    // 组件销毁后确保不活跃
    this._isComponentActive = false
  },

  methods: {
    /**
     * 安全更新方法，带重试机制
     * @param {Object} data - 要更新的数据
     * @param {number} maxRetries - 最大重试次数
     * @returns {Promise}
     */
    async safeUpdateWithRetry(data, maxRetries = this._maxRetries) {
      if (!this._isComponentActive) {
        console.warn('组件不活跃，跳过更新')
        return Promise.resolve()
      }

      for (let attempt = 1; attempt <= maxRetries; attempt++) {
        try {
          await simpleUpdate(this, data)
          this._updateRetryCount = 0 // 重置重试计数
          return // 成功则退出
        } catch (error) {
          console.error(`更新失败 (尝试 ${attempt}/${maxRetries}):`, error)
          this._updateRetryCount = attempt

          // 如果是视图相关错误，等待更长时间再重试
          if (this.isViewUpdateError(error)) {
            await this.waitForViewReady(attempt * 200)
          }

          // 最后一次尝试失败，记录错误
          if (attempt === maxRetries) {
            this.handleUpdateError(error, data, maxRetries)
            throw error
          }
        }
      }
    },

    /**
     * 检查是否是视图更新错误
     * @param {Error} error - 错误对象
     * @returns {boolean}
     */
    isViewUpdateError(error) {
      const errorStr = error.message || error.toString()
      return errorStr.includes('32776') || 
             errorStr.includes('32774') || 
             errorStr.includes('32773') ||
             errorStr.includes('insertTextView') ||
             errorStr.includes('updateTextView') ||
             errorStr.includes('insertImageView') ||
             errorStr.includes('updateImageView')
    },

    /**
     * 等待视图准备就绪
     * @param {number} delay - 延迟时间
     * @returns {Promise}
     */
    waitForViewReady(delay = 100) {
      return new Promise(resolve => {
        setTimeout(() => {
          // 在微信小程序环境中，尝试触发重绘
          if (typeof wx !== 'undefined' && this.$nextTick) {
            this.$nextTick(() => {
              resolve()
            })
          } else {
            resolve()
          }
        }, delay)
      })
    },

    /**
     * 处理更新错误
     * @param {Error} error - 错误对象
     * @param {Object} data - 尝试更新的数据
     * @param {number} attempts - 尝试次数
     */
    handleUpdateError(error, data, attempts) {
      const componentName = this.$options.name || 'UnknownComponent'
      
      console.error('安全更新最终失败:', {
        component: componentName,
        error: error.message,
        data: data,
        attempts: attempts,
        timestamp: new Date().toISOString()
      })

      // 记录到错误监控系统
      if (typeof errorMonitoring !== 'undefined' && errorMonitoring.logTextUpdateError) {
        errorMonitoring.logTextUpdateError('SAFE_UPDATE_RETRY_FAILED', error, {
          component: componentName,
          data: data,
          attempts: attempts
        })
      }
    },

    /**
     * 批量安全更新
     * @param {Array} updates - 更新数组 [{data, delay}]
     * @returns {Promise}
     */
    async batchSafeUpdate(updates) {
      if (!this._isComponentActive) {
        console.warn('组件不活跃，跳过批量更新')
        return
      }

      for (const update of updates) {
        if (!this._isComponentActive) break

        if (update.delay) {
          await this.waitForViewReady(update.delay)
        }

        try {
          await this.safeUpdateWithRetry(update.data)
        } catch (error) {
          console.error('批量更新中的单项失败:', error)
          // 继续处理其他更新项
        }
      }
    },

    /**
     * 强制重新渲染组件
     */
    forceRerender() {
      if (!this._isComponentActive) return

      try {
        // Vue 强制更新
        if (this.$forceUpdate) {
          this.$forceUpdate()
        }
        
        // 微信小程序强制更新
        if (typeof this.setData === 'function') {
          this.setData({
            _forceUpdate: Date.now()
          })
        }
      } catch (error) {
        console.error('强制重新渲染失败:', error)
      }
    }
  }
}